LabVIEW中可重入VI设置详解

您所在的位置:网站首页 labview vi的状态与该操作不兼容 LabVIEW中可重入VI设置详解

LabVIEW中可重入VI设置详解

2024-06-29 01:38| 来源: 网络整理| 查看: 265

在编程过程中,有时我们需要对VI的重入执行属性进行不同的设置,以满足不同的应用场景。那么,每种设置类型的含义和特性分别是什么?本文将进行一个详细的归纳和讲解。

一 重入执行的类型

点击“文件->VI属性->执行”,即可对VI的重入执行类型进行设置。如下图所示,共有三种不同的类型:1.非重入执行;2.共享副本重入执行;3.预先分副本重入执行。默认情况下,勾选“非重入执行”这一选项。

二 非重入执行

 “非重入执行”为所有子VI实例分配一个数据空间,它的代码和数据都只有一份。当主程序在不同的地方同时调用该子VI时,一次只能执行一个调用,因此调用是按照顺序依次进行的。优势是,在三种方式中,它的内存消耗是最小的,且所有调用共享状态。当我们需要子VI即使被多次调用也要按顺序依次运行时,我们就可以使用这一类型。

举一个简单的例子,如下图所示是一个子VI的程序框图,设置为不可重入,它的功能是等待1s。

下图是调用这个子VI的主程序的程序框图,共调用两次,请大家思考,运行总耗时应该是多少?

按照上文概念的分析,不可重入子VI在调用时,必须按先后顺序依次执行,每次调用等待1s,运行总耗时就是2s。

三 共享副本重入执行

该类型设置下,多个调用者同步、多次并行调用同一个子VI,此时子VI的多个实例是共享同一个副本的,也就是使用同一块数据空间,这样可减少内存消耗。但是,多个实例同时去操作一块数据空间,可能会引起数据的混乱。

举一个简单的例子,如下图所示,是一个设置为“共享副本重入执行”的子VI,它的功能是输出该VI运行的次数。

下图所示为调用这个子VI的主程序,那么运行次数1和运行次数2的值分别是多少呢?

答案是:不确定,只能确定它们可能是小于30的任意一个数。因为被设置为可重入后,左右两处调用可以并行进行,我们不能确定它们在某一时刻各自运行了几次,但是因为共享副本,它们又在操作同一块数据空间。试想,假如某一时刻,左侧循环写入数据空间的运行次数为6,紧接着右侧循环的运行次数是8,也立马写入同一块数据空间,将左侧写入的6覆盖掉了。这样,在运行过程中相互修改覆盖,结果就完全是随机的了。

因此,如果能确保不会产生数据混乱的情况,我们可以将子VI设置为“共享副本重入执行”,避免对内存的过多消耗。但如果是初学者,或者不够有把握,也没有必需的场景,最好不要使用这一设置。

四 预先分副本重入执行

允许多个调用者同步、并行执行该VI ,并为每个实例分配单独的、非共享副本。这样每个调用都有自己的数据空间,彼此独立运行、互不干扰,也就不会发生数据混乱。但由于为每个实例都单独分配了一块数据存储空间,所以这种类型也是内存消耗最高的一种。

问题1: “运行总耗时”的例子中,如果将子VI设置为“预先分副本重入执行”,结果应该是多少?

答案是:1s。因为可重入调用并行运行,不管调用几次,运行总耗时都是1s。同理,如果设置为“共享副本重入执行”,结果也是1s。

问题2:“运行次数”例子中,如果将子VI设置为“预先分副本重入执行”,结果应该是多少?

答案是:左侧为10,右侧为20,且是确定的结果。这是因为,两边的调用都被分配了各自的数据空间,互不干扰,不管运行次序如何,左侧共被调用10次,右侧共被调用20次。

以上,就是对VI的重入执行设置的一些归纳。文中所用到的简单示例程序随文附上,如有不对之处,欢迎批评指正。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3